package dao;

import java.util.Date;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import dominio.ItemListaProveedor;
import dominio.ListaProveedor;
import dominio.Proveedor;
import dominio.Rodamiento;
import utils.DateUtils;
import utils.XmlUtils;

public class ListaProveedorXmlDAO {
	private static ListaProveedorXmlDAO instance;

	public static ListaProveedorXmlDAO getInstance() {
		if (instance == null)
			instance = new ListaProveedorXmlDAO();
		return instance;
	}

	private ListaProveedorXmlDAO() {}

	public Proveedor getProveedor(Document xml) throws Exception {
		// Lista de Precios
		Element elementLista = XmlUtils.getElement(xml, "ListaPrecios");
		if (elementLista != null)
			return XmlUtils.parseProveedor(elementLista);
		throw new Exception("Formato incorrecto del archivo XML.");
	}

	public ListaProveedor parse(Document xml) throws Exception {
		// Lista de Precios
		Element elementLista = XmlUtils.getElement(xml, "ListaPrecios");
		if (elementLista != null) {
			ListaProveedor lista = new ListaProveedor();
			// Vigencia
			parseVigencia(elementLista, lista);
			// Rodamientos
			Element elementRodamientos = XmlUtils.getElement(elementLista, "Rodamientos");
			if (elementRodamientos != null) {
				NodeList items = elementRodamientos.getElementsByTagName("Item");
				for (int i = 0; i < items.getLength(); ++i)
					lista.agregarItem(parseItem((Element) items.item(i)));
				return lista;
			}
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}

	private void parseVigencia(Element elementLista, ListaProveedor lista) throws Exception {
		Element elementVigencia = XmlUtils.getElement(elementLista, "Vigencia");
		if (elementVigencia == null)
			throw new Exception("Formato incorrecto del archivo XML.");
		Element elementFecha = XmlUtils.getElement(elementVigencia, "Fecha");
		Element elementTermino = XmlUtils.getElement(elementVigencia, "Termino");
		if (elementFecha == null || elementTermino == null)
			throw new Exception("Formato incorrecto del archivo XML.");
		Date fecha = DateUtils.parse(elementFecha.getTextContent());
		int termino = Integer.parseInt(elementTermino.getTextContent());
		lista.setFecha(fecha);
		lista.setTermino(termino);
	}

	private ItemListaProveedor parseItem(Element item) throws Exception {
		// Serie
		String serie = item.getAttribute("serie");
		// Sufijo
		Element elementSufijo = XmlUtils.getElement(item, "Sufijo");
		// Marca
		Element elementMarca = XmlUtils.getElement(item, "Marca");
		// Pais
		Element elementPais = XmlUtils.getElement(item, "Origen");
		// Precio
		Element elementPrecio = XmlUtils.getElement(item, "Precio");
		// Stock
		Element elementStock = XmlUtils.getElement(item, "Stock");
		if (serie != null && elementSufijo != null && elementMarca != null && elementPais != null && elementPrecio != null && elementStock != null) {
			ItemListaProveedor i = new ItemListaProveedor();
			// Rodamiento
			Rodamiento r = new Rodamiento();
			r.setSerie(serie);
			r.setSufijo(elementSufijo.getTextContent());
			r.setMarca(elementMarca.getTextContent());
			r.setPais(elementPais.getTextContent());
			i.setRodamiento(r);
			// Precio
			i.setPrecio(Float.parseFloat(elementPrecio.getTextContent()));
			// Stock
			i.setStock(Integer.parseInt(elementStock.getTextContent()));
			return i;
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}
}